home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / programmierung / alienbreed3d2_src / cheesesauce / wallroutine3.chipmem < prev    next >
Text File  |  1997-01-31  |  26KB  |  1,838 lines

  1. leftclip: dc.w 0
  2. rightclip: dc.w 0
  3. deftopclip: dc.w 0
  4. defbotclip: dc.w 0
  5. leftclipandlast: dc.w 0
  6.  
  7. SCALE MACRO
  8.  dc.w 64*0
  9.  dc.w 64*1
  10.  dc.w 64*1
  11.  dc.w 64*2
  12.  dc.w 64*2
  13.  dc.w 64*3
  14.  dc.w 64*3
  15.  dc.w 64*4
  16.  dc.w 64*4
  17.  dc.w 64*5
  18.  dc.w 64*5
  19.  dc.w 64*6
  20.  dc.w 64*6
  21.  dc.w 64*7
  22.  dc.w 64*7
  23.  dc.w 64*8
  24.  dc.w 64*8
  25.  dc.w 64*9
  26.  dc.w 64*9
  27.  dc.w 64*10
  28.  dc.w 64*10
  29.  dc.w 64*11
  30.  dc.w 64*11
  31.  dc.w 64*12
  32.  dc.w 64*12
  33.  dc.w 64*13
  34.  dc.w 64*13
  35.  dc.w 64*14
  36.  dc.w 64*14
  37.  dc.w 64*15
  38.  dc.w 64*15
  39.  dc.w 64*16
  40.  dc.w 64*16
  41.  dc.w 64*17
  42.  dc.w 64*17
  43.  dc.w 64*18
  44.  dc.w 64*18
  45.  dc.w 64*19
  46.  dc.w 64*19
  47.  dc.w 64*20
  48.  dc.w 64*20
  49.  dc.w 64*21
  50.  dc.w 64*21
  51.  dc.w 64*22
  52.  dc.w 64*22
  53.  dc.w 64*23
  54.  dc.w 64*23
  55.  dc.w 64*24
  56.  dc.w 64*24
  57.  dc.w 64*25
  58.  dc.w 64*25
  59.  dc.w 64*26
  60.  dc.w 64*26
  61.  dc.w 64*27
  62.  dc.w 64*27
  63.  dc.w 64*28
  64.  dc.w 64*28
  65.  dc.w 64*29
  66.  dc.w 64*29
  67.  dc.w 64*30
  68.  dc.w 64*30
  69.  dc.w 64*31
  70.  dc.w 64*31
  71.  dc.w 64*31
  72.  dc.w 64*31
  73.  dc.w 64*31
  74.  dc.w 64*31
  75.  dc.w 64*31
  76.  dc.w 64*31
  77.  dc.w 64*31
  78.  dc.w 64*31
  79.  dc.w 64*31
  80.  dc.w 64*31
  81.  dc.w 64*31
  82.  dc.w 64*31
  83.  dc.w 64*31
  84.  dc.w 64*31
  85.  dc.w 64*31
  86.  dc.w 64*31
  87.  dc.w 64*31
  88.  dc.w 64*31
  89.  ENDM
  90.  
  91. *********************************** 
  92.  
  93. * The screendivide routine is simpler
  94. * using a0=left pixel
  95. * a2= right pixel
  96. * d0= left dist
  97. * d2= right dist
  98. * d4 = left strip
  99. * d5 = right strip
  100.  
  101. * (a0)=leftx
  102. * 2(a0)=rightx
  103.  
  104. * 4(a0)=leftbm
  105. * 6(a0)=rightbm
  106.  
  107. * 8(a0)=leftdist
  108. * 10(a0)=rightdist
  109.  
  110. * 12(a0)=lefttop
  111. * 14(a0)=righttop
  112.  
  113. * 16(a0)=leftbot
  114. * 18(a0)=rightbot
  115.  
  116.  
  117. Doleftend:
  118.  
  119.  move.w leftclip,d0
  120.  sub.w #1,d0
  121.  move.w d0,leftclipandlast
  122.  
  123.  
  124.  move.w (a0),d0
  125.  move.w 2(a0),d1
  126.  sub.w d0,d1
  127.  bge.s sometodraw
  128.  rts
  129. sometodraw:
  130.  move.w itertab(pc,d1.w*4),d7
  131.  swap d0
  132.  move.w itertab+2(pc,d1.w*4),d6
  133.  clr.w d0
  134.  swap d1
  135.  clr.w d1
  136.  asr.l d6,d1
  137.  move.l d1,(a0)
  138.  
  139.  bra pstit
  140.  
  141. itertab:
  142.  incbin "iterfile"
  143.  
  144. pstit:
  145.  
  146.  moveq #0,d1
  147.  move.w 4(a0),d1
  148.  moveq #0,d2
  149.  move.w 6(a0),d2
  150.  sub.w d1,d2
  151.  swap d1
  152.  swap d2
  153.  asr.l d6,d2
  154.  move.l d2,4(a0)
  155.  
  156.  moveq #0,d2
  157.  move.w 8(a0),d2
  158.  moveq #0,d3
  159.  move.w 10(a0),d3
  160.  sub.w d2,d3
  161.  swap d2
  162.  swap d3
  163.  asr.l d6,d3
  164.  move.l d3,8(a0)
  165.  
  166.  moveq #0,d3
  167.  move.w 12(a0),d3
  168.  moveq #0,d4
  169.  move.w 14(a0),d4
  170.  sub.w d3,d4
  171.  swap d3
  172.  swap d4
  173.  asr.l d6,d4
  174.  move.l d4,12(a0)
  175.  
  176.  moveq #0,d4
  177.  move.w 16(a0),d4
  178.  moveq #0,d5
  179.  move.w 18(a0),d5
  180.  sub.w d4,d5
  181.  swap d4
  182.  swap d5
  183.  asr.l d6,d5
  184.  move.l d5,16(a0)
  185.  
  186.  
  187. *** Gouraud shading ***
  188.  moveq #0,d5
  189.  move.w 26(a0),d5
  190.  sub.w 24(a0),d5
  191.  add.w d5,d5
  192.  swap d5
  193.  asr.l d6,d5
  194.  move.l d5,28(a0)
  195.  moveq #0,d5
  196.  move.w 24(a0),d5
  197.  add.w d5,d5
  198.  swap d5
  199.  
  200.  bra screendivide
  201.  
  202. itercount: dc.w 0
  203.  
  204. screendividethru:
  205.  
  206. .scrdrawlop:
  207.  
  208.  move.w (a0)+,d0
  209.  move.l frompt,a3
  210.  adda.w .scrintocop(pc,d0.w*2),a3
  211.  move.l (a0)+,d1
  212.  
  213.  bra .pastscrinto
  214.  
  215. .scrintocop:
  216.  incbin "XTOCOPX"
  217.  
  218. .pastscrinto 
  219.  
  220.  swap d1
  221.  
  222.  move.w d1,d6
  223.  and.w HORAND,d6
  224.  move.l (a0)+,d2
  225.  swap d2
  226.  add.w fromtile(pc),d6
  227.  add.w d6,d6
  228.  move.w d6,a5
  229.  move.l (a0)+,d3
  230.  swap d3
  231.  add.l #divthreetab,a5
  232.  move.w (a5),StripData
  233.  
  234.  move.l ChunkAddr,a5
  235.  moveq #0,d6
  236.  move.b StripData,d6
  237.  add.w d6,d6
  238.  move.w VALSHIFT,d4
  239.  asl.w d4,d6
  240.  add.w d6,a5
  241.  move.l (a0)+,d4
  242.  swap d4
  243.  move.w d2,d6
  244. ***************************
  245. * old version
  246.  asr.w #7,d6
  247. ***************************
  248. ; asr.w #3,d6
  249. ; sub.w #4,d6
  250. ; cmp.w #6,d6
  251. ; blt.s tstbrbr
  252. ; move.w #6,d6
  253. ;tstbrbr:
  254. ***************************
  255.  add.w angbright(pc),d6
  256.  bge.s .brnotneg
  257.  moveq #0,d6
  258. .brnotneg
  259.  cmp.w #32,d6
  260.  blt.s .brnotpos
  261.  move.w #32,d6
  262. .brnotpos
  263.  move.l PaletteAddr,a2
  264.  move.l a2,a4
  265.  add.w .ffscrpickhowbright(pc,d6*2),a2
  266. ; and.b #$fe,d6
  267. ; add.w .ffscrpickhowbright(pc,d6*2),a4
  268.  
  269. ; btst #0,d0
  270. ; beq .nobrightswap
  271. ; exg a2,a4
  272. ;.nobrightswap:
  273.  
  274.  move.w d7,-(a7)
  275.  bsr ScreenWallstripdrawthru
  276.  move.w (a7)+,d7
  277.  
  278.  dbra d7,.scrdrawlop
  279.  rts
  280.  
  281. .ffscrpickhowbright:
  282.  SCALE
  283.  
  284.  
  285. ***************************
  286.  
  287. screendivide:
  288.  
  289.  or.l #$ffff0000,d7
  290.  move.w leftclipandlast(pc),d6
  291.  move.l #WorkSpace,a2
  292.  
  293.  move.l (a0),a3
  294.  move.l 4(a0),a4
  295.  move.l 8(a0),a5
  296.  move.l 12(a0),a6
  297.  move.l 16(a0),a1
  298.  move.l 28(a0),a0
  299.  
  300. scrdivlop:
  301.  
  302.  swap d0
  303.  cmp.w d6,d0
  304.  bgt scrnotoffleft
  305.  swap d0
  306.  add.l a4,d1
  307.  add.l a5,d2
  308.  add.l a6,d3
  309.  add.l a1,d4
  310.  add.l a3,d0
  311.  add.l a0,d5
  312.  dbra d7,scrdivlop
  313.  rts
  314.  
  315. scrnotoffleft:
  316.  
  317.  move.w d0,d6
  318.  
  319.  cmp.w rightclip(pc),d0
  320.  bge.s outofcalc
  321.  
  322. scrnotoffright:
  323.  
  324.  
  325.  move.w d0,(a2)+
  326.  move.l d1,(a2)+
  327.  move.l d2,(a2)+
  328.  move.l d3,(a2)+
  329.  move.l d4,(a2)+
  330.  move.l d5,(a2)+
  331.  swap d0
  332.  add.l a3,d0
  333.  add.l a4,d1
  334.  add.l a5,d2
  335.  add.l a6,d3
  336.  add.l a1,d4
  337.  add.l a0,d5
  338.  add.l #$10000,d7
  339.  dbra d7,scrdivlop
  340.  
  341. outofcalc:
  342.  swap d7
  343.  tst.w d7
  344.  bge.s .somethingtodraw
  345.  rts
  346. .somethingtodraw:
  347.  
  348.  move.l #consttab,a1
  349.  move.l #WorkSpace,a0
  350.  
  351. ; tst.b seethru
  352. ; bne screendividethru
  353.  
  354. scrdrawlop:
  355.  
  356.  move.w (a0)+,d0
  357.  move.l frompt,a3
  358.  adda.w scrintocop(pc,d0.w*2),a3
  359.  move.l (a0)+,d1
  360.  
  361.  bra pastscrinto
  362.  
  363. middleline:
  364.  dc.w 0
  365.  
  366. scrintocop:
  367.  incbin "XTOCOPX"
  368. prot4: dc.w 0
  369.  
  370. fromtile: dc.l 0
  371. fromquartertile: dc.l 0
  372. swapbrights: dc.w 0
  373. angbright: dc.w 0
  374.  
  375. leftside: dc.b 0
  376. rightside: dc.b 0
  377. firstleft: dc.w 0
  378.  
  379. pastscrinto 
  380.  
  381.  swap d1
  382.  
  383.  move.w d1,d6
  384.  and.w HORAND,d6
  385.  move.l (a0)+,d2
  386.  swap d2
  387.  add.w fromtile(pc),d6
  388.  add.w d6,d6
  389.  move.w d6,a5
  390.  move.l (a0)+,d3
  391.  swap d3
  392.  add.l #divthreetab,a5
  393.  move.w (a5),StripData
  394.  
  395.  move.l ChunkAddr,a5
  396.  moveq #0,d6
  397.  move.b StripData,d6
  398.  add.w d6,d6
  399.  move.w VALSHIFT,d4
  400.  asl.w d4,d6
  401.  add.w d6,a5
  402.  move.l (a0)+,d4
  403.  swap d4
  404.  move.w d2,d6
  405. ***************************
  406. * old version
  407.  asr.w #7,d6
  408. ***************************
  409. ; asr.w #3,d6
  410. ; sub.w #4,d6
  411. ; cmp.w #6,d6
  412. ; blt.s tstbrbr
  413. ; move.w #6,d6
  414. ;tstbrbr:
  415. ***************************
  416.  move.l (a0)+,d5
  417.  swap d5
  418.  ext.w d5
  419.  add.w d5,d6
  420.  bge.s .brnotneg
  421.  moveq #0,d6
  422. .brnotneg
  423.  cmp.w #64,d6
  424.  blt.s .brnotpos
  425.  move.w #64,d6
  426. .brnotpos
  427.  move.l PaletteAddr,a2
  428.  move.l a2,a4
  429.  add.w ffscrpickhowbright(pc,d6*2),a2
  430. ; and.b #$fe,d6
  431. ; add.w ffscrpickhowbright(pc,d6*2),a4
  432.  
  433. ; btst #0,d0
  434. ; beq .nobrightswap
  435. ; exg a2,a4
  436. ;.nobrightswap:
  437.  
  438.  move.w d7,-(a7)
  439.  bsr ScreenWallstripdraw
  440.  move.w (a7)+,d7
  441.  
  442. toosmall:
  443.  
  444.  dbra d7,scrdrawlop
  445.  
  446.  rts
  447.  
  448. ffscrpickhowbright:
  449.  SCALE
  450.  
  451. divthreetab:
  452. val SET 0
  453.  REPT 130
  454.  dc.b val,0
  455.  dc.b val,1
  456.  dc.b val,2
  457. val SET val+1
  458.  ENDR
  459.  
  460. StripData: dc.w 0
  461.  
  462. * using a0=left pixel
  463. * a2= right pixel
  464. * d0= left height
  465. * d2= right height
  466. * d4 = left strip
  467. * d5 = right strip
  468.  
  469.  
  470. * Routine to draw a wall;
  471. * pass it X and Z coords of the endpoints
  472. * and the start and end length, and a number
  473. * representing the number of the wall.
  474.  
  475. * a0=x1 d1=z1 a2=x2 d3=z2
  476. * d4=sl d5=el
  477. * a1 = strip buffer
  478.  
  479. store: ds.l 500
  480.  
  481. ******************************************************************
  482.  
  483. * Curve drawing routine. We have to know:
  484. * The top and bottom of the wall
  485. * The point defining the centre of the arc
  486. * the point defining the starting point of the arc
  487. * the start and end angles of the arc
  488. * The start and end positions along the bitmap of the arc
  489. * Which bitmap to use for the arc
  490.  
  491. xmiddle: dc.w 0
  492. zmiddle SET 2
  493.  dc.w 0
  494. xradius SET 4
  495.  dc.w 0
  496. zradius SET 6
  497.  dc.w 0
  498. startbitmap SET 8
  499.  dc.w 0
  500. bitmapcounter SET 10
  501.  dc.w 0
  502. brightmult SET 12
  503.  dc.w 0
  504. angadd SET 14
  505.  dc.l 0
  506. xmiddlebig SET 18
  507.  dc.l 0
  508. basebright SET 22
  509.  dc.w 0
  510. shift SET 24
  511.  dc.w 0
  512. count SET 26
  513.  dc.w 0
  514.  
  515. subdividevals:
  516.  dc.w 2,4
  517.  dc.w 3,8
  518.  dc.w 4,16
  519.  dc.w 5,32
  520.  dc.w 6,64
  521.  
  522. CurveDraw:
  523.  
  524.  move.w (a0)+,d0    ; centre of rotation
  525.  move.w (a0)+,d1    ; point on arc
  526.  move.l #Rotated,a1
  527.  move.l #xmiddle,a2
  528.  move.l (a1,d0.w*8),d2
  529.  move.l d2,18(a2)
  530.  asr.l #7,d2
  531.  move.l (a1,d1.w*8),d4
  532.  asr.l #7,d4
  533.  sub.w d2,d4
  534.  move.w d2,(a2)
  535.  move.w d4,4(a2)
  536.  move.w 6(a1,d0.w*8),d2
  537.  move.w 6(a1,d1.w*8),d4
  538.  sub.w d2,d4
  539.  move.w d2,2(a2)
  540.  asr.w #1,d4
  541.  move.w d4,6(a2)
  542.  move.w (a0)+,d4    ; start of bitmap
  543.  move.w (a0)+,d5    ; end of bitmap
  544.  move.w d4,8(a2)
  545.  sub.w d4,d5
  546.  move.w d5,10(a2)
  547.  move.w (a0)+,d4
  548.  ext.l d4
  549.  move.l d4,14(a2)
  550.  move.w (a0)+,d4
  551.  move.l #subdividevals,a3
  552.  move.l (a3,d4.w*4),shift(a2)
  553.  
  554.  move.l #walltiles,a3
  555.  add.l (a0)+,a3
  556.  adda.w wallyoff,a3
  557.  move.l a3,fromtile
  558.  move.w (a0)+,basebright(a2)
  559.  move.w (a0)+,brightmult(a2)
  560.  move.l (a0)+,topofwall
  561.  move.l (a0)+,botofwall
  562.  move.l yoff,d6
  563.  sub.l d6,topofwall
  564.  sub.l d6,botofwall
  565.  
  566.  move.l #databuffer,a1
  567.  move.l #SineTable,a3
  568.  lea 2048(a3),a4
  569.  moveq #0,d0
  570.  moveq #0,d1
  571.  move.w count(a2),d7
  572. DivideCurve
  573.  move.l d0,d2
  574.  move.w shift(a2),d4
  575.  asr.l d4,d2
  576.  move.w (a3,d2.w*2),d4
  577.  move.w d4,d5
  578.  move.w (a4,d2.w*2),d3
  579.  move.w d3,d6
  580.  muls.w 4(a2),d3
  581.  muls.w 6(a2),d4
  582.  muls.w 4(a2),d5
  583.  muls.w 6(a2),d6
  584.  sub.l d4,d3
  585.  add.l d6,d5
  586.  asl.l #2,d5
  587.  asr.l #8,d3
  588.  add.l 18(a2),d3
  589.  swap d5
  590.  move.w basebright(a2),d6
  591.  move.w brightmult(a2),d4
  592.  muls d5,d4
  593.  swap d4
  594.  add.w d4,d6
  595.  
  596.  add.w 2(a2),d5
  597.  move.l d3,(a1)+
  598.  move.w d5,(a1)+
  599.  move.w d1,d2
  600.  move.w shift(a2),d4
  601.  asr.w d4,d2
  602.  add.w 8(a2),d2
  603.  move.w d2,(a1)+
  604.  move.w d6,(a1)+
  605.  
  606.  add.l 14(a2),d0  
  607.  add.w 10(a2),d1
  608.  dbra d7,DivideCurve
  609.  
  610.  move.l a0,-(a7)
  611.  
  612. ; move.w #31,d6
  613. ; move.l #0,d3
  614. ; move.l #stripbuffer,a4
  615. ;.emptylop:
  616. ; move.l d3,(a4)+
  617. ; dbra d6,.emptylop
  618.  
  619.  bsr curvecalc
  620.  
  621.  move.l (a7)+,a0
  622.  
  623.  rts
  624.  
  625. prot3: dc.w 0
  626.  
  627. curvecalc:
  628.  move.l #databuffer,a1
  629.  move.w count(a2),d7
  630.  subq #1,d7
  631. .findfirstinfront:
  632.  move.l (a1)+,d1
  633.  move.w (a1)+,d0
  634.  bgt.s .foundinfront
  635.  move.w (a1)+,d4
  636.  move.w (a1)+,d6
  637.  dbra d7,.findfirstinfront
  638. ; CACHE_ON d2
  639.  rts    ; no two points were in front
  640.  
  641. .foundinfront:
  642.  move.w (a1)+,d4
  643.  move.w (a1)+,d6
  644.  ; d1=left x, d4=left end, d0=left dist
  645.  ; d6=left angbright 
  646.  
  647.  divs d0,d1
  648.  add.w #47,d1
  649.  
  650.  move.l topofwall(pc),d5
  651.  divs d0,d5
  652.  add.w #40,d5
  653.  move.w d5,strtop
  654.  move.l botofwall(pc),d5
  655.  divs d0,d5
  656.  add.w #40,d5
  657.  move.w d5,strbot
  658.  
  659. ; CACHE_OFF d2
  660.  
  661. .computeloop:
  662.  move.w 4(a1),d2
  663.  bgt.s .infront
  664.  
  665. ; addq #8,a1
  666. ; dbra d7,.findfirstinfront
  667.  
  668. ; CACHE_ON d2
  669.  rts
  670.  
  671. .infront:
  672.  move.l #store,a0
  673.  move.l (a1),d3
  674.  move.w 6(a1),d5
  675.  add.w 8(a1),d6
  676.  asr.w #1,d6
  677.  move.w d6,angbright
  678.  divs d2,d3
  679.  add.w #47,d3
  680.  move.w strtop(pc),12(a0)
  681.  move.w strbot(pc),16(a0)
  682.  move.l topofwall(pc),d6
  683.  divs d2,d6
  684.  add.w #40,d6
  685.  move.w d6,strtop
  686.  move.w d6,14(a0)
  687.  move.l botofwall(pc),d6
  688.  divs d2,d6
  689.  add.w #40,d6
  690.  move.w d6,strbot
  691.  move.w d6,18(a0)
  692.  move.w d3,2(a1)
  693.  blt.s .alloffleft
  694.  cmp.w #95,d1
  695.  bgt.s .alloffleft
  696.  
  697.  cmp.w d1,d3
  698.  blt.s .alloffleft
  699.  
  700.  move.w d1,(a0)
  701.  move.w d3,2(a0)
  702.  move.w d4,4(a0)
  703.  move.w d5,6(a0)
  704.  move.w d0,8(a0)
  705.  move.w d2,10(a0)
  706.  move.w d7,-(a7)
  707.  move.w #maxscrdiv,d7
  708.  bsr Doleftend
  709.  move.w (a7)+,d7
  710.  
  711. .alloffleft:
  712.  
  713.  move.l (a1)+,d1
  714.  move.w (a1)+,d0
  715.  move.w (a1)+,d4
  716.  move.w (a1)+,d6
  717.  
  718.  dbra d7,.computeloop
  719.  
  720. .alloffright:
  721. ; CACHE_ON d2
  722.  rts
  723.  
  724. ;protcheck:
  725. ; sub.l #53624,a3
  726. ; add.l #2345215,a2
  727. ; lea passspace-$30000(pc),a1
  728. ; add.l #$30000,a1
  729. ; lea startpass(pc),a5
  730. ; move.w #endpass-startpass-1,d1
  731. ;copypass:
  732. ; move.b (a5)+,(a1)+
  733. ; dbra d1,copypass
  734. ; sub.l a5,a5
  735. ; lea passspace-$30000(pc),a1
  736. ; add.l #$30000,a1
  737. ; jsr (a1)
  738. ; lea passspace-$30000(pc),a1
  739. ; add.l #$30000,a1
  740. ; lea startpass(pc),a5
  741. ; move.w #(endpass-startpass)/2-1,d1
  742. ;erasepass:
  743. ; move.w -(a5),(a1)+
  744. ; dbra d1,erasepass
  745. ; sub.l a5,a5
  746. ; sub.l a1,a1
  747. ; eor.l #$af594c72,d0
  748. ; sub.l #123453986,a4
  749. ; move.l d0,(a4)
  750. ; add.l #123453986,a4
  751. ; move.l #0,d0
  752. ; sub.l #2345215,a2
  753. ; jsr (a2)
  754. ; sub.l a2,a2
  755. ; eor.l #$af594c72,d0
  756. ; sub.l #123453986,a4
  757. ; move.l (a4),d1
  758. ; add.l #123453986,a4
  759. ; cmp.l d1,d0
  760. ; bne.s notrightt
  761. ; add.l #53624,a3
  762. ; move.w #9,d7
  763. ;sayitsok:
  764. ; move.l (a3)+,a2
  765. ; add.l #78935450,a2
  766. ; st (a2)
  767. ; dbra d7,sayitsok
  768. ;notrightt:
  769. ; sub.l a3,a3
  770. ;nullit:
  771. ; rts
  772. ; incbin "ab3:includes/protroutencoded"
  773.  
  774. endprot:
  775.  
  776. ******************************************************************
  777.  
  778. iters: dc.w 0
  779. multcount: dc.w 0
  780.  
  781. walldraw:
  782.  
  783.  tst.w d1
  784.  bgt.s oneinfront1
  785.  tst.w d3
  786.  bgt.s oneinfront
  787.  rts
  788.  
  789. oneinfront1
  790.  tst.w d3
  791.  ble.s oneinfront
  792. ; Bothinfront!
  793.  
  794.  nop
  795.  
  796. oneinfront
  797.  
  798.  move.w #16,d7
  799.  move.w #2,d6
  800.  
  801.  move.w d3,d0
  802.  sub.w d1,d0
  803.  bge.s notnegzdiff
  804.  neg.w d0
  805. notnegzdiff
  806.  cmp.w #1024,d0
  807.  blt.s nd01
  808.  add.w d7,d7
  809.  add.w #1,d6
  810. nd01:
  811.  cmp.w #512,d0
  812.  blt.s nd0 
  813.  add.w d7,d7
  814.  add.w #1,d6
  815.  bra nha
  816. nd0:
  817.  
  818.  cmp.w #256,d0
  819.  bgt.s nh1
  820.  asr.w #1,d7
  821.  subq #1,d6
  822. nh1:
  823.  cmp.w #128,d0
  824.  bgt.s nh2
  825.  asr.w #1,d7
  826.  subq #1,d6
  827. nh2:
  828.  
  829. nha:
  830.  
  831.  move.w d3,d0
  832.  cmp.w d1,d3
  833.  blt.s rightnearest
  834.  move.w d1,d0
  835. rightnearest:
  836.  cmp.w #64,d0
  837.  bgt.s nd1
  838.  addq #1,d6
  839.  add.w d7,d7
  840. nd1:
  841.  
  842.  cmp.w #128,d0
  843.  blt.s nh3
  844.  asr.w #1,d7
  845.  subq #1,d6
  846.  blt.s nh3
  847.  cmp.w #256,d0
  848.  blt.s nh3
  849.  asr.w #1,d7
  850.  subq #1,d6
  851. nh3:
  852.  move.w d6,iters
  853.  subq #1,d7
  854.  move.w d7,multcount
  855.  
  856.  move.l #databuffer,a3
  857.  move.l a0,d0
  858.  move.l a2,d2
  859.  
  860.  move.l d0,(a3)+
  861.  add.l d2,d0
  862.  move.w d1,(a3)+
  863.  asr.l #1,d0
  864.  move.w d4,(a3)+
  865.  
  866.  move.w leftwallbright,d6
  867.  move.w d6,(a3)+
  868.  
  869.  add.w d5,d4
  870.  move.l d0,(a3)+
  871.  add.w d3,d1
  872.  asr.w #1,d1
  873.  move.w d1,(a3)+
  874.  asr.w #1,d4
  875.  move.w d4,(a3)+
  876.  
  877.  add.w rightwallbright,d6
  878.  asr.w #1,d6
  879.  move.w d6,(a3)+
  880.  
  881.  move.l d2,(a3)+
  882.  move.w d3,(a3)+
  883.  move.w d5,(a3)+
  884.  move.w rightwallbright,(a3)+
  885.  
  886.  ; We now have the two endpoints and the midpoint
  887.  ; so we need to perform 1 iteration of the inner
  888.  ; loop, the first time.
  889.  
  890. * Decide how often to subdivide by how far away the wall is, and
  891. * how perp. it is to the player.
  892.  
  893.  move.l #databuffer,a0
  894.  move.l #databuffer2,a1
  895.  
  896.  move.w iters,d6
  897.  blt noiters
  898.  move.l #1,a2
  899.  
  900. iterloop:
  901.  move.l a0,a3
  902.  move.l a1,a4
  903.  move.w a2,d7
  904.  exg a0,a1
  905.  
  906.  move.l (a3)+,d0
  907.  move.w (a3)+,d1
  908.  move.l (a3)+,d2
  909. middleloop:
  910.  move.l d0,(a4)+
  911.  move.l (a3)+,d3
  912.  add.l d3,d0
  913.  move.w d1,(a4)+
  914.  asr.l #1,d0
  915.  move.w (a3)+,d4
  916.  add.w d4,d1
  917.  move.l d2,(a4)+
  918.  asr.w #1,d1
  919.  move.l (a3)+,d5
  920.  add.l d5,d2
  921.  move.l d0,(a4)+
  922.  asr.l #1,d2
  923.  move.w d1,(a4)+
  924.  move.l d2,(a4)+
  925.  
  926.  move.l d3,(a4)+
  927.  move.l (a3)+,d0
  928.  add.l d0,d3
  929.  
  930.  move.w d4,(a4)+
  931.  asr.l #1,d3
  932.  move.w (a3)+,d1
  933.  add.w d1,d4
  934.  move.l d5,(a4)+
  935.  asr.w #1,d4
  936.  move.l (a3)+,d2
  937.  add.l d2,d5
  938.  move.l d3,(a4)+
  939.  asr.l #1,d5
  940.  move.w d4,(a4)+
  941.  move.l d5,(a4)+
  942.  
  943.  
  944.  subq #1,d7
  945.  bgt.s middleloop
  946.  move.l d0,(a4)+
  947.  move.w d1,(a4)+
  948.  move.l d2,(a4)+
  949.  
  950.  add.w a2,a2
  951.  
  952.  dbra d6,iterloop
  953.  
  954. noiters:
  955.  
  956. CalcAndDraw:
  957.  
  958. ; CACHE_ON d2
  959.  
  960.  move.l a0,a1
  961.  move.w multcount,d7
  962. .findfirstinfront:
  963.  move.l (a1)+,d1
  964.  move.w (a1)+,d0
  965.  bgt.s .foundinfront
  966.  move.l (a1)+,d4
  967.  dbra d7,.findfirstinfront
  968.  rts    ; no two points were in front
  969.  
  970. .foundinfront:
  971.  move.w (a1)+,d4
  972.  move.w (a1)+,lbr
  973.  ; d1=left x, d4=left end, d0=left dist 
  974.  
  975.  divs d0,d1
  976.  add.w #47,d1
  977.  
  978.  move.l topofwall(pc),d5
  979.  divs d0,d5
  980.  add.w #40,d5
  981.  move.w d5,strtop
  982.  move.l botofwall(pc),d5
  983.  divs d0,d5
  984.  add.w #40,d5
  985.  move.w d5,strbot
  986.  
  987. .computeloop:
  988.  move.w 4(a1),d2
  989.  bgt.s .infront
  990.  rts
  991.  
  992. .infront:
  993.  move.l #store,a0
  994.  move.l (a1),d3
  995.  divs d2,d3
  996.  move.w 6(a1),d5
  997.  add.w #47,d3
  998.  move.w strtop(pc),12(a0)
  999.  move.l topofwall(pc),d6
  1000.  divs d2,d6
  1001.  move.w strbot(pc),16(a0)
  1002.  add.w #40,d6
  1003.  move.w d6,strtop
  1004.  move.w d6,14(a0)
  1005.  move.l botofwall(pc),d6
  1006.  divs d2,d6
  1007.  add.w #41,d6
  1008.  move.w d6,strbot
  1009.  move.w d6,18(a0)
  1010.  move.w d3,2(a1)
  1011.  cmp.w leftclip(pc),d3
  1012.  blt.s .alloffleft
  1013.  cmp.w rightclip(pc),d1
  1014. ; cmp.w #95,d1
  1015.  bge.s .alloffright
  1016.  
  1017.  move.w d1,(a0)
  1018.  move.w d3,2(a0)
  1019.  move.w d4,4(a0)
  1020.  move.w d5,6(a0)
  1021.  move.w d0,8(a0)
  1022.  move.w d2,10(a0)
  1023.  
  1024.  move.w lbr,d5
  1025.  sub.w #300,d5
  1026.  ext.w d5
  1027.  move.w d5,24(a0)
  1028.  move.w 8(a1),d5
  1029.  sub.w #300,d5
  1030.  ext.w d5
  1031.  move.w d5,26(a0)
  1032.  
  1033.  movem.l d7/a1,-(a7)
  1034.  move.w #maxscrdiv,d7
  1035.  bsr Doleftend
  1036.  movem.l (a7)+,d7/a1
  1037.  
  1038. .alloffleft:
  1039.  
  1040.  move.l (a1)+,d1
  1041.  move.w (a1)+,d0
  1042.  move.w (a1)+,d4
  1043.  move.w (a1)+,lbr
  1044.  
  1045.  dbra d7,.computeloop
  1046.  rts
  1047.  
  1048. .alloffright:
  1049.  rts
  1050.  
  1051. lbr: dc.w 0
  1052. leftwallbright: dc.w 0
  1053. rightwallbright: dc.w 0
  1054. strtop: dc.w 0
  1055. strbot: dc.w 0
  1056.  
  1057. databuffer:
  1058.  ds.l 600
  1059. databuffer2:
  1060.  ds.l 600
  1061.  
  1062. ***********************************
  1063.  
  1064. * Need a routine which takes...?
  1065. * Top Y (3d)
  1066. * Bottom Y (3d)
  1067. * distance
  1068. * height of each tile (number and routine addr)
  1069. * And produces the appropriate strip on the
  1070. * screen.
  1071.  
  1072. topofwall: dc.l 0
  1073. botofwall: dc.l 0
  1074.  
  1075. nostripq:
  1076.  rts
  1077.  
  1078. ScreenWallstripdraw:
  1079.  
  1080.  move.w d4,d6
  1081.  cmp.w topclip(pc),d6
  1082.  blt.s nostripq
  1083.  cmp.w botclip(pc),d3
  1084.  bgt.s nostripq
  1085.  
  1086.  cmp.w botclip(pc),d6
  1087.  ble.s noclipbot
  1088.  move.w botclip(pc),d6
  1089. noclipbot:
  1090.  
  1091.  move.w d3,d5
  1092.  cmp.w topclip(pc),d5
  1093.  bge.s nocliptop
  1094.  move.w topclip(pc),d5
  1095. ; btst #0,d5
  1096. ; beq.s .nsbd
  1097. ; exg a2,a4
  1098. ;.nsbd:
  1099.  
  1100.  sub.w d5,d6    ; height to draw.
  1101.  ble.s nostripq
  1102.  
  1103.  bra gotoend
  1104.  
  1105. nocliptop:
  1106.  
  1107. ; btst #0,d5
  1108. ; beq.s .nsbd
  1109. ; exg a2,a4
  1110. ;.nsbd:
  1111.  
  1112.  sub.w d5,d6    ; height to draw.
  1113.  ble.s nostripq
  1114.  
  1115.  bra gotoend
  1116.  
  1117. wlcnt: dc.w 0
  1118.  
  1119. ; CNOP 0,4
  1120. ;drawwalldimPACK0:
  1121. ; and.w d7,d4
  1122. ; move.b 1(a5,d4.w*2),d1
  1123. ; and.b #31,d1
  1124. ; add.l d3,d4
  1125. ; move.w (a4,d1.w*2),(a3)
  1126. ; adda.w d0,a3
  1127. ; addx.w d2,d4
  1128. ; dbra d6,drawwallPACK0
  1129. ; rts
  1130.  
  1131.  CNOP 0,128 
  1132. drawwallPACK0:
  1133.  and.w d7,d4
  1134.  move.b 1(a5,d4.w*2),d1
  1135.  and.b #31,d1
  1136.  add.l d3,d4
  1137.  move.w (a2,d1.w*2),(a3)
  1138.  adda.w d0,a3
  1139.  addx.w d2,d4
  1140.  dbra d6,drawwallPACK0
  1141.  
  1142. nostrip:
  1143.  rts
  1144.  
  1145. ; CNOP 0,4
  1146. ;drawwalldimPACK1:
  1147. ; and.w d7,d4
  1148. ; move.w (a5,d4.w*2),d1
  1149. ; lsr.w #5,d1
  1150. ; and.w #31,d1
  1151. ; add.l d3,d4
  1152. ; move.w (a4,d1.w*2),(a3)
  1153. ; adda.w d0,a3
  1154. ; addx.w d2,d4
  1155. ; dbra d6,drawwallPACK1
  1156. ; rts
  1157.  
  1158.  CNOP 0,4 
  1159. drawwallPACK1:
  1160.  and.w d7,d4
  1161.  move.w (a5,d4.w*2),d1
  1162.  lsr.w #5,d1
  1163.  and.w #31,d1
  1164.  add.l d3,d4
  1165.  move.w (a2,d1.w*2),(a3)
  1166.  adda.w d0,a3
  1167.  addx.w d2,d4
  1168.  dbra d6,drawwallPACK1
  1169.  
  1170.  rts
  1171.  
  1172.  CNOP 0,4
  1173. ;drawwalldimPACK2:
  1174. ; and.w d7,d4
  1175. ; move.b (a5,d4.w*2),d1
  1176. ; lsr.b #2,d1
  1177. ; add.l d3,d4
  1178. ; move.w (a4,d1.w*2),(a3)
  1179. ; adda.w d0,a3
  1180. ; addx.w d2,d4
  1181. ; dbra d6,drawwallPACK2
  1182. ; rts
  1183.  
  1184.  CNOP 0,4 
  1185. drawwallPACK2:
  1186.  and.w d7,d4
  1187.  move.b (a5,d4.w*2),d1
  1188.  lsr.b #2,d1
  1189.  add.l d3,d4
  1190.  move.w (a2,d1.w*2),(a3)
  1191.  adda.w d0,a3
  1192.  addx.w d2,d4
  1193.  dbra d6,drawwallPACK2
  1194.  rts
  1195.  
  1196.  
  1197. usesimple:
  1198.  mulu d3,d4
  1199.  
  1200.  add.l d0,d4
  1201.  swap d4
  1202.  add.w totalyoff(pc),d4
  1203.  
  1204. cliptopusesimple
  1205.  move.w VALAND,d7
  1206.  move.w #104*4,d0
  1207.  moveq #0,d1
  1208. ; cmp.l a4,a2
  1209. ; blt.s usea2
  1210. ; move.l a4,a2
  1211. ;usea2:
  1212.  
  1213.  and.w d7,d4
  1214.  
  1215.  move.l d2,d5
  1216.  clr.w d5
  1217.  cmp.b #1,StripData+1
  1218.  dbge d6,simplewalliPACK0
  1219.  dbne d6,simplewalliPACK1
  1220.  dble d6,simplewalliPACK2
  1221.  rts
  1222.  
  1223.  CNOP 0,4
  1224. simplewalliPACK0:
  1225.  move.b 1(a5,d4.w*2),d1
  1226.  and.b #31,d1
  1227.  move.w (a2,d1.w*2),d3
  1228. simplewallPACK0:
  1229.  move.w d3,(a3)
  1230.  adda.w d0,a3
  1231.  add.l d2,d4
  1232.  bcc.s .noread
  1233.  addq #1,d4
  1234.  and.w d7,d4
  1235.  move.b 1(a5,d4.w*2),d1
  1236.  and.b #31,d1
  1237.  move.w (a2,d1.w*2),d3
  1238. .noread:
  1239.  dbra d6,simplewallPACK0
  1240.  rts
  1241.  
  1242.  CNOP 0,4
  1243. simplewalliPACK1:
  1244.  move.w (a5,d4.w*2),d1
  1245.  lsr.w #5,d1
  1246.  and.w #31,d1
  1247.  move.w (a2,d1.w*2),d3
  1248. simplewallPACK1:
  1249.  move.w d3,(a3)
  1250.  adda.w d0,a3
  1251.  add.l d5,d4
  1252.  bcc.s .noread
  1253.  addq #1,d4
  1254.  and.w d7,d4
  1255.  move.w (a5,d4.w*2),d1
  1256.  lsr.w #5,d1
  1257.  and.w #31,d1
  1258.  move.w (a2,d1.w*2),d3
  1259. .noread:
  1260.  dbra d6,simplewallPACK1
  1261.  rts
  1262.  
  1263.  CNOP 0,4
  1264. simplewalliPACK2:
  1265.  move.b (a5,d4.w*2),d1
  1266.  lsr.b #2,d1
  1267.  and.b #31,d1
  1268.  move.w (a2,d1.w*2),d3
  1269. simplewallPACK2:
  1270.  move.w d3,(a3)
  1271.  adda.w d0,a3
  1272.  add.l d5,d4
  1273.  bcc.s .noread
  1274.  addq #1,d4
  1275.  and.w d7,d4
  1276.  move.b (a5,d4.w*2),d1
  1277.  lsr.b #2,d1
  1278.  move.w (a2,d1.w*2),d3
  1279. .noread:
  1280.  dbra d6,simplewallPACK2
  1281.  rts
  1282.  
  1283. ;gotoendnomult:
  1284. ; movem.l d0/d1/d2/d3/d4/d7,-(a7)
  1285. ; add.l timeslarge(pc,d5.w*4),a3 
  1286. ; move.w d5,d4
  1287. ; move.l 4(a1,d2.w*8),d0
  1288. ; move.l (a1,d2.w*8),d2
  1289. ; moveq #0,d3
  1290. ; move.w d2,d3
  1291. ; swap d2
  1292. ; tst.w d2
  1293. ; move.w wallyoff(pc),d4
  1294. ; add.w #44,d4
  1295. ; bne.s .notsimple
  1296. ; cmp.l #$b000,d3
  1297. ; ble cliptopusesimple
  1298. ;.notsimple:
  1299. ; bra cliptop
  1300.  
  1301. gotoend:
  1302.  
  1303.  add.l timeslarge(pc,d5.w*4),a3 
  1304.  move.w d5,d4
  1305.  move.l 4(a1,d2.w*8),d0
  1306.  move.l (a1,d2.w*8),d2
  1307.  moveq #0,d3
  1308.  move.w d2,d3
  1309.  swap d2
  1310.  tst.w d2
  1311.  bne.s .notsimple
  1312.  cmp.l #$b000,d3
  1313.  ble usesimple
  1314. .notsimple:
  1315.  
  1316.  mulu d3,d4
  1317.  muls d2,d5
  1318.  add.l d0,d4
  1319.  swap d4
  1320.  add.w d5,d4
  1321.  add.w totalyoff(pc),d4
  1322. cliptop
  1323.  move.w VALAND,d7
  1324.  and.w d7,d4
  1325.  move.w #104*4,d0
  1326.  moveq #0,d1
  1327.  
  1328.  move.l d2,d3
  1329.  clr.w d3
  1330.  
  1331.  cmp.b #1,StripData+1
  1332.  dbge d6,drawwallPACK0
  1333.  dbne d6,drawwallPACK1
  1334.  dble d6,drawwallPACK2
  1335.  rts
  1336.  
  1337. timeslarge:
  1338.  
  1339. val SET 104*4
  1340.  REPT 80
  1341.  dc.l val
  1342. val SET val+104*4
  1343.  ENDR
  1344.  
  1345. nostripqthru:
  1346.  rts
  1347.  
  1348. ScreenWallstripdrawthru:
  1349.  
  1350.  move.w d4,d6
  1351.  cmp.w topclip(pc),d6
  1352.  blt.s nostripqthru
  1353.  cmp.w botclip(pc),d3
  1354.  bgt.s nostripqthru
  1355.  
  1356.  cmp.w botclip(pc),d6
  1357.  ble.s .noclipbot
  1358.  move.w botclip(pc),d6
  1359. .noclipbot:
  1360.  
  1361.  move.w d3,d5
  1362.  cmp.w topclip(pc),d5
  1363.  bge.s .nocliptop
  1364.  move.w topclip(pc),d5
  1365. ; btst #0,d5
  1366. ; beq.s .nsbd
  1367. ; exg a2,a4
  1368. ;.nsbd:
  1369.  
  1370.  sub.w d5,d6    ; height to draw.
  1371.  ble.s nostripqthru
  1372.  
  1373.  bra gotoendthru
  1374.  
  1375. .nocliptop:
  1376.  
  1377. ; btst #0,d5
  1378. ; beq.s .nsbdthru
  1379. ; exg a2,a4
  1380. ;.nsbdthru:
  1381.  
  1382.  sub.w d5,d6    ; height to draw.
  1383.  ble.s nostripqthru
  1384.  
  1385.  bra gotoendthru
  1386.  
  1387.  CNOP 0,4
  1388. drawwalldimthruPACK0:
  1389.  and.w d7,d4
  1390.  move.b 1(a5,d4.w*2),d1
  1391.  and.b #31,d1
  1392.  beq.s .holey
  1393.  move.w (a4,d1.w*2),(a3)
  1394. .holey:
  1395.  adda.w d0,a3
  1396.  add.l d3,d4
  1397.  addx.w d2,d4
  1398.  dbra d6,drawwallthruPACK0
  1399.  rts
  1400.  CNOP 0,4
  1401. drawwallthruPACK0:
  1402.  and.w d7,d4
  1403.  move.b 1(a5,d4.w*2),d1
  1404.  and.b #31,d1
  1405.  beq.s .holey
  1406.  move.w (a2,d1.w*2),(a3)
  1407. .holey:
  1408.  adda.w d0,a3
  1409.  add.l d3,d4
  1410.  addx.w d2,d4
  1411.  dbra d6,drawwalldimthruPACK0
  1412. nostripthru:
  1413.  rts
  1414.  
  1415.  CNOP 0,4
  1416. drawwalldimthruPACK1:
  1417.  and.w d7,d4
  1418.  move.w (a5,d4.w*2),d1
  1419.  lsr.w #5,d1
  1420.  and.w #31,d1
  1421.  beq.s .holey
  1422.  move.w (a4,d1.w*2),(a3)
  1423. .holey:
  1424.  adda.w d0,a3
  1425.  add.l d3,d4
  1426.  addx.w d2,d4
  1427.  dbra d6,drawwallthruPACK1
  1428.  rts
  1429.  CNOP 0,4
  1430. drawwallthruPACK1:
  1431.  and.w d7,d4
  1432.  move.w (a5,d4.w*2),d1
  1433.  lsr.w #5,d1
  1434.  and.w #31,d1
  1435.  beq.s .holey
  1436.  move.w (a2,d1.w*2),(a3)
  1437. .holey:
  1438.  adda.w d0,a3
  1439.  add.l d3,d4
  1440.  addx.w d2,d4
  1441.  dbra d6,drawwalldimthruPACK1
  1442.  rts
  1443.  
  1444.  CNOP 0,4
  1445. drawwalldimthruPACK2:
  1446.  and.w d7,d4
  1447.  move.b (a5,d4.w*2),d1
  1448.  lsr.b #2,d1
  1449.  and.b #31,d1
  1450.  beq.s .holey
  1451.  move.w (a4,d1.w*2),(a3)
  1452. .holey:
  1453.  adda.w d0,a3
  1454.  add.l d3,d4
  1455.  addx.w d2,d4
  1456.  dbra d6,drawwallthruPACK2
  1457.  rts
  1458.  CNOP 0,4
  1459. drawwallthruPACK2:
  1460.  and.w d7,d4
  1461.  move.b (a5,d4.w*2),d1
  1462.  lsr.b #2,d1
  1463.  and.b #31,d1
  1464.  beq.s .holey
  1465.  move.w (a2,d1.w*2),(a3)
  1466. .holey:
  1467.  adda.w d0,a3
  1468.  add.l d3,d4
  1469.  addx.w d2,d4
  1470.  dbra d6,drawwalldimthruPACK2
  1471.  rts
  1472.  
  1473.  
  1474. usesimplethru:
  1475.  mulu d3,d4
  1476.  
  1477.  add.l d0,d4
  1478.  swap d4
  1479.  add.w totalyoff(pc),d4
  1480.  
  1481. cliptopusesimplethru
  1482.  moveq #63,d7
  1483.  move.w #104*4,d0
  1484.  moveq #0,d1
  1485.  cmp.l a4,a2
  1486.  blt.s usea2thru
  1487.  move.l a4,a2
  1488. usea2thru:
  1489.  and.w d7,d4
  1490.  
  1491.  move.l d2,d5
  1492.  clr.w d5
  1493.  
  1494.  cmp.b #1,StripData+1
  1495.  dbge d6,simplewallthruiPACK0
  1496.  dbne d6,simplewallthruiPACK1
  1497.  dble d6,simplewallthruiPACK2
  1498.  rts
  1499.  
  1500.  CNOP 0,4
  1501. simplewallthruiPACK0:
  1502.  move.b 1(a5,d4.w*2),d1
  1503.  and.b #31,d1
  1504.  move.w (a2,d1.w*2),d3
  1505. simplewallthruPACK0:
  1506.  move.w d3,(a3)
  1507.  adda.w d0,a3
  1508.  add.l d5,d4
  1509.  bcc.s noreadthruPACK0
  1510. maybeholePACK0
  1511.  addx.w d2,d4
  1512.  and.w d7,d4
  1513.  move.b 1(a5,d4.w*2),d1
  1514.  and.b #31,d1
  1515.  beq.s holeysimplePACK0
  1516.  move.w (a2,d1.w*2),d3
  1517.  dbra d6,simplewallthruPACK0
  1518.  rts
  1519. noreadthruPACK0:
  1520.  addx.w d2,d4
  1521.  dbra d6,simplewallthruPACK0
  1522.  rts
  1523.  
  1524.  CNOP 0,4
  1525. simplewallholePACK0:
  1526.  adda.w d0,a3
  1527.  add.l d5,d4
  1528.  bcs.s maybeholePACK0
  1529.  addx.w d2,d4
  1530. holeysimplePACK0
  1531.  and.w d7,d4
  1532.  dbra d6,simplewallholePACK0
  1533.  rts
  1534.  
  1535.  CNOP 0,4
  1536. simplewallthruiPACK1:
  1537.  move.w (a5,d4.w*2),d1
  1538.  lsr.w #5,d1
  1539.  and.w #31,d1
  1540.  move.w (a2,d1.w*2),d3
  1541.  simplewallthruPACK1:
  1542.  move.w d3,(a3)
  1543.  adda.w d0,a3
  1544.  add.l d5,d4
  1545.  bcc.s noreadthruPACK1
  1546. maybeholePACK1
  1547.  addx.w d2,d4
  1548.  and.w d7,d4
  1549.  move.w (a5,d4.w*2),d1
  1550.  lsr.w #5,d1
  1551.  and.w #31,d1
  1552.  beq.s holeysimplePACK1
  1553.  move.w (a2,d1.w*2),d3
  1554.  dbra d6,simplewallthruPACK1
  1555.  rts
  1556. noreadthruPACK1:
  1557.  addx.w d2,d4
  1558.  dbra d6,simplewallthruPACK1
  1559.  rts
  1560.  
  1561.  CNOP 0,4
  1562. simplewallholePACK1:
  1563.  adda.w d0,a3
  1564.  add.l d5,d4
  1565.  bcs.s maybeholePACK1
  1566.  addx.w d5,d4
  1567. holeysimplePACK1
  1568.  and.w d7,d4
  1569.  dbra d6,simplewallholePACK1
  1570.  rts
  1571.  
  1572.  
  1573.  CNOP 0,4
  1574. simplewallthruiPACK2:
  1575.  move.b (a5,d4.w*2),d1
  1576.  lsr.b #2,d1
  1577.  and.b #31,d1
  1578.  move.w (a2,d1.w*2),d3
  1579. simplewallthruPACK2:
  1580.  move.w d3,(a3)
  1581.  adda.w d0,a3
  1582.  add.l d5,d4
  1583.  bcc.s noreadthruPACK2
  1584. maybeholePACK2
  1585.  addx.w d2,d4
  1586.  and.w d7,d4
  1587.  move.b (a5,d4.w*2),d1
  1588.  lsr.b #2,d1
  1589.  and.b #31,d1
  1590.  beq.s holeysimplePACK2
  1591.  move.w (a2,d1.w*2),d3
  1592.  dbra d6,simplewallthruPACK2
  1593.  rts
  1594. noreadthruPACK2:
  1595.  addx.w d2,d4
  1596.  dbra d6,simplewallthruPACK2
  1597.  rts
  1598.  
  1599.  CNOP 0,4
  1600. simplewallholePACK2
  1601.  adda.w d0,a3
  1602.  add.l d5,d4
  1603.  bcs.s maybeholePACK2
  1604.  addx.w d2,d4
  1605. holeysimplePACK2
  1606.  and.w d7,d4
  1607.  dbra d6,simplewallholePACK2
  1608.  rts
  1609.  
  1610.  
  1611. gotoendthru:
  1612.  add.l timeslargethru(pc,d5.w*4),a3 
  1613.  move.w d5,d4
  1614.  move.l 4(a1,d2.w*8),d0
  1615.  move.l (a1,d2.w*8),d2
  1616.  moveq #0,d3
  1617.  move.w d2,d3
  1618.  swap d2
  1619.  tst.w d2
  1620.  bne.s .notsimple
  1621.  cmp.l #$b000,d3
  1622.  ble usesimplethru
  1623. .notsimple:
  1624.  
  1625.  mulu d3,d4
  1626.  muls d2,d5
  1627.  add.l d0,d4
  1628.  swap d4
  1629.  add.w d5,d4
  1630.  add.w wallyoff(pc),d4
  1631. cliptopthru
  1632.  moveq #63,d7
  1633.  move.w #104*4,d0
  1634.  moveq #0,d1
  1635.  
  1636.  move.l d2,d3
  1637.  clr.w d3
  1638.  
  1639.  cmp.b #1,StripData+1
  1640.  dbge d6,drawwallthruPACK0
  1641.  dbne d6,drawwallthruPACK1
  1642.  dble d6,drawwallthruPACK2
  1643.  
  1644.  rts
  1645.  
  1646. timeslargethru:
  1647.  
  1648. val SET 104*4
  1649.  REPT 80
  1650.  dc.l val
  1651. val SET val+104*4
  1652.  ENDR
  1653.  
  1654. totalyoff: dc.w 0
  1655. wallyoff: dc.w 0
  1656.  
  1657. ******************************************
  1658. * Wall polygon
  1659. leftend: dc.w 0
  1660. wallbrightoff: dc.w 0
  1661.  
  1662. itsawalldraw:
  1663.  
  1664.  move.l #Rotated,a5
  1665.  move.l #OnScreen,a6
  1666.  
  1667.  move.w (a0)+,d0
  1668.  move.w (a0)+,d2
  1669.  move.w (a0)+,leftend
  1670.  move.w (a0)+,d5
  1671.  move.w (a0)+,d1
  1672.  asl.w #4,d1
  1673.  move.w d1,fromtile
  1674.  
  1675.  move.w (a0)+,d1
  1676.  move.w d1,totalyoff
  1677.  
  1678.  move.w (a0)+,d1
  1679.  move.l #walltiles,a3
  1680.  move.l (a3,d1.w*4),a3
  1681.  move.l a3,PaletteAddr
  1682.  add.l #64*32,a3
  1683.  move.l a3,ChunkAddr
  1684.  
  1685.  ;move.w (a0)+,d1
  1686.  ;add.w ZoneBright,d1
  1687.  move.w ZoneBright,angbright
  1688.  ;move.w (a0)+,d1
  1689.  ;move.w (a0)+,d4
  1690.  move.l yoff,d6
  1691.  
  1692.  move.b (a0)+,VALAND+1
  1693.  move.b (a0)+,VALSHIFT+1
  1694.  move.w (a0)+,HORAND
  1695.  
  1696.  move.w totalyoff,d1
  1697.  add.w wallyoff,d1
  1698.  and.w VALAND,d1
  1699.  move.w d1,totalyoff
  1700.  
  1701.  move.l (a0)+,topofwall
  1702.  sub.l d6,topofwall
  1703.  move.l (a0)+,botofwall
  1704.  sub.l d6,botofwall
  1705.  
  1706.  
  1707.  move.w (a0)+,wallbrightoff
  1708.  
  1709.  move.l topofwall,d3
  1710.  cmp.l botofwall,d3
  1711.  bge wallfacingaway
  1712.  
  1713.  
  1714.  tst.w 6(a5,d0*8)
  1715.  bgt.s cantell
  1716.  tst.w 6(a5,d2*8)
  1717.  ble wallfacingaway
  1718.  bra cliptotestfirstbehind
  1719. cantell:
  1720.  tst.w 6(a5,d2*8)
  1721.  ble.s cliptotestsecbehind
  1722.  bra pastclip
  1723. cliptotestfirstbehind:
  1724.  
  1725.  move.l (a5,d0*8),d3
  1726.  sub.l (a5,d2*8),d3
  1727.  move.w 6(a5,d0*8),d6
  1728.  sub.w 6(a5,d2*8),d6
  1729.  divs d6,d3
  1730.  muls 6(a5,d2*8),d3
  1731.  neg.l d3
  1732.  add.l (a5,d2*8),d3
  1733.  move.w (a6,d2*2),d6
  1734.  sub.w #47,d6
  1735.  ext.l d6
  1736.  cmp.l d6,d3
  1737.  bge wallfacingaway
  1738.  bra cant_tell
  1739.  bra pastclip
  1740.  
  1741. cliptotestsecbehind:
  1742.  
  1743.  move.l (a5,d2*8),d3
  1744.  sub.l (a5,d0*8),d3
  1745.  move.w 6(a5,d2*8),d6
  1746.  sub.w 6(a5,d0*8),d6
  1747.  divs d6,d3
  1748.  muls 6(a5,d0*8),d3
  1749.  neg.l d3
  1750.  add.l (a5,d0*8),d3
  1751.  move.w (a6,d0*2),d6
  1752.  sub.w #47,d6
  1753.  ext.l d6
  1754.  cmp.l d6,d3
  1755.  ble wallfacingaway
  1756.  bra cant_tell
  1757.  
  1758. pastclip:
  1759.  
  1760.  move.w (a6,d0*2),d3
  1761.  cmp.w #95,d3
  1762.  bgt wallfacingaway
  1763.  cmp.w (a6,d2*2),d3
  1764.  bge wallfacingaway
  1765.  tst.w (a6,d2*2)
  1766.  blt.s wallfacingaway
  1767.  
  1768. cant_tell:
  1769.  
  1770. ; move.l a1,a4
  1771. ; move.w #31,d6
  1772. ; move.l #0,d3
  1773. ;.emptylop:
  1774. ; move.l d3,(a4)+
  1775. ; dbra d6,.emptylop
  1776.  
  1777. ; move.w rightclip(pc),d6
  1778. ; st (a1,d6)
  1779. ; move.w leftclip(pc),d6
  1780. ; st -1(a1,d6)
  1781.  
  1782. ; muls sinval(pc),d1
  1783. ; muls cosval(pc),d4
  1784. ; add.l d1,d4
  1785. ; add.l d4,d4
  1786. ; swap d4
  1787. ; neg.w d4
  1788. ; move.w d4,d6
  1789. ; asr.w #1,d4
  1790. ; sub.w d4,angbright
  1791. ; and.b #$fe,d4
  1792. ; asl.w #2,d4
  1793. ; asl.w #2,d6
  1794.  
  1795.  movem.l d7/a0/a5/a6,-(a7)
  1796.  move.l (a5,d0*8),a0
  1797.  move.w 6(a5,d0*8),d1
  1798.  move.l (a5,d2*8),a2
  1799.  move.w 6(a5,d2*8),d3
  1800.  
  1801.  move.l PointBrightsPtr,a5
  1802.  move.w (a5,d0.w*4),d0
  1803.  add.w #300,d0
  1804.  add.w wallbrightoff,d0
  1805.  move.w d0,leftwallbright
  1806.  move.w (a5,d2.w*4),d0
  1807.  add.w #300,d0
  1808.  add.w wallbrightoff,d0
  1809.  move.w d0,rightwallbright
  1810.  
  1811.  move.w leftend(pc),d4
  1812.  move.l #max3ddiv,d7
  1813.  bsr walldraw
  1814.  movem.l (a7)+,d7/a0/a5/a6
  1815.  
  1816. wallfacingaway:
  1817.  
  1818.  rts
  1819.  
  1820. PointBrightsPtr: dc.l 0
  1821. midpt: dc.l 0
  1822. dist1: dc.l 0
  1823. dist2: dc.l 0
  1824. VALAND: dc.w 0
  1825. VALSHIFT: dc.w 0
  1826. HORAND: dc.w 0
  1827.  
  1828. sinval: dc.w 0
  1829. cosval: dc.w 0
  1830.  
  1831. oldxoff: dc.w 0
  1832. oldzoff: dc.w 0
  1833.  
  1834. topclip: dc.w 0
  1835. botclip: dc.w 0
  1836. seethru: dc.w 0
  1837.